package com.bawei.image

import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import java.io.ByteArrayOutputStream

/**
 * 作者：Jason
 * 日期：2023/10/31
 * 描述：Bitmap工具类
 * 知识点：Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息，进行图像剪切、旋转、缩放等操作，并可以指定格式保存图像文件
 * 通常图片压缩方式：1.质量压缩；2.采样率压缩；3.矩阵压缩法；4.格式压缩；5.创建缩放位图
 */
class BitmapUtil {

    companion object {

        /**
         * 方式一：质量压缩（对PNG图片无效，PNG图片本身属于无损压缩图片）
         */
        fun compressQuality(resources: Resources, resId: Int, quality: Int): Bitmap{
            var bm = BitmapFactory.decodeResource(resources, resId)
            var bos = ByteArrayOutputStream()
            bm.compress(Bitmap.CompressFormat.JPEG, 100, bos)
            var bytes = bos.toByteArray()
            return BitmapFactory.decodeByteArray(bytes, quality, bytes.size)
        }


        /**
         * 方式二：二次采样压缩
         */
        fun getCompressBitmap(resources: Resources, resId: Int, maxWidth: Int, maxHeight: Int): Bitmap? {
            var sampleSize = 1
            //第一次采样：获取图片宽高
            var bitmapOptions = BitmapFactory.Options()
            bitmapOptions.inJustDecodeBounds = true //开启仅加载图片边界大小值（不会产生内存消耗）
            BitmapFactory.decodeResource(resources, resId, bitmapOptions)
            var bmWidth = bitmapOptions.outWidth
            var bmHeight = bitmapOptions.outHeight
            //第二次采样：计算采样值
            while (bmWidth > maxWidth || bmHeight > maxHeight){ //只要比最大宽高大就再计算一次
                //每次都压缩1/2
                sampleSize *= 2
                //重新计算大小
                bmWidth /= sampleSize
                bmHeight /= sampleSize
            }
            bitmapOptions.inJustDecodeBounds = false //关闭解析边界大小
            bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565 //设置编码方式
            bitmapOptions.inSampleSize = sampleSize //设置采样率
            return BitmapFactory.decodeResource(resources, resId, bitmapOptions)
        }

        /**
         * 方式三：矩阵压缩
         */
        fun compressMatrix(resources: Resources, resId: Int, sx: Float, sy: Float): Bitmap{
            var matrix = Matrix()
            matrix.setScale(sx, sy)
            var bm = BitmapFactory.decodeResource(resources, resId)
            return Bitmap.createBitmap(bm, 0, 0, bm.width, bm.height, matrix, true)
        }

        /**
         * 方式四：RGB_565压缩
         */
        fun compressRGB565(resources: Resources, resId: Int): Bitmap {
            var bitmapOptions = BitmapFactory.Options()
            bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565
            return BitmapFactory.decodeResource(resources, resId, bitmapOptions)
        }

        /**
         * 方式五：使用缩放，二次创建Bitmap
         */
        fun compressScaleBitmap(resources: Resources, resId: Int, dstWidth: Int, dstHeight: Int): Bitmap{
            var bm = BitmapFactory.decodeResource(resources, resId)
            return Bitmap.createScaledBitmap(bm, dstWidth, dstHeight, true)
        }
    }

}